home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / IfStatement.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  3.9 KB  |  123 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.Label;
  7. import sun.tools.java.Environment;
  8. import sun.tools.java.Type;
  9.  
  10. public class IfStatement extends Statement {
  11.    Expression cond;
  12.    Statement ifTrue;
  13.    Statement ifFalse;
  14.  
  15.    public IfStatement(int var1, Expression var2, Statement var3, Statement var4) {
  16.       super(90, var1);
  17.       this.cond = var2;
  18.       this.ifTrue = var3;
  19.       this.ifFalse = var4;
  20.    }
  21.  
  22.    long check(Environment var1, Context var2, long var3, Hashtable var5) {
  23.       CheckContext var6 = new CheckContext(var2, this);
  24.       ConditionVars var7 = this.cond.checkCondition(var1, var6, ((Statement)this).reach(var1, var3), var5);
  25.       this.cond = ((Node)this).convert(var1, var6, Type.tBoolean, this.cond);
  26.       long var8 = var7.vsTrue == -1L ? var3 : var7.vsTrue;
  27.       long var10 = var7.vsFalse == -1L ? var3 : var7.vsFalse;
  28.       var8 = this.ifTrue.check(var1, var6, var8, var5);
  29.       if (this.ifFalse != null) {
  30.          var10 = this.ifFalse.check(var1, var6, var10, var5);
  31.       }
  32.  
  33.       var3 = var8 & var10 & var6.vsBreak;
  34.       return var2.removeAdditionalVars(var3);
  35.    }
  36.  
  37.    public Statement inline(Environment var1, Context var2) {
  38.       var2 = new Context(var2, this);
  39.       this.cond = this.cond.inlineValue(var1, var2);
  40.       if (this.cond.equals(true)) {
  41.          this.ifTrue = this.ifTrue.inline(var1, var2);
  42.          return ((Statement)this).eliminate(var1, this.ifTrue);
  43.       } else if (this.cond.equals(false)) {
  44.          return ((Statement)this).eliminate(var1, this.ifFalse != null ? this.ifFalse.inline(var1, var2) : null);
  45.       } else {
  46.          if (this.ifTrue != null) {
  47.             this.ifTrue = this.ifTrue.inline(var1, var2);
  48.          }
  49.  
  50.          if (this.ifFalse != null) {
  51.             this.ifFalse = this.ifFalse.inline(var1, var2);
  52.          }
  53.  
  54.          if (this.ifTrue == null && this.ifFalse == null) {
  55.             return ((Statement)this).eliminate(var1, (new ExpressionStatement(super.where, this.cond)).inline(var1, var2));
  56.          } else if (this.ifTrue == null) {
  57.             this.cond = (new NotExpression(this.cond.where, this.cond)).inlineValue(var1, var2);
  58.             return ((Statement)this).eliminate(var1, new IfStatement(super.where, this.cond, this.ifFalse, (Statement)null));
  59.          } else {
  60.             return this;
  61.          }
  62.       }
  63.    }
  64.  
  65.    public Statement copyInline(Context var1, boolean var2) {
  66.       IfStatement var3 = (IfStatement)((Node)this).clone();
  67.       var3.cond = this.cond.copyInline(var1);
  68.       if (this.ifTrue != null) {
  69.          var3.ifTrue = this.ifTrue.copyInline(var1, var2);
  70.       }
  71.  
  72.       if (this.ifFalse != null) {
  73.          var3.ifFalse = this.ifFalse.copyInline(var1, var2);
  74.       }
  75.  
  76.       return var3;
  77.    }
  78.  
  79.    public int costInline(int var1) {
  80.       int var2 = 1 + this.cond.costInline(var1);
  81.       if (this.ifTrue != null) {
  82.          var2 += this.ifTrue.costInline(var1);
  83.       }
  84.  
  85.       if (this.ifFalse != null) {
  86.          var2 += this.ifFalse.costInline(var1);
  87.       }
  88.  
  89.       return var2;
  90.    }
  91.  
  92.    public void code(Environment var1, Context var2, Assembler var3) {
  93.       CodeContext var4 = new CodeContext(var2, this);
  94.       Label var5 = new Label();
  95.       this.cond.codeBranch(var1, var4, var3, var5, false);
  96.       this.ifTrue.code(var1, var4, var3);
  97.       if (this.ifFalse != null) {
  98.          Label var6 = new Label();
  99.          var3.add(super.where, 167, var6);
  100.          var3.add(var5);
  101.          this.ifFalse.code(var1, var4, var3);
  102.          var3.add(var6);
  103.       } else {
  104.          var3.add(var5);
  105.       }
  106.  
  107.       var3.add(var4.breakLabel);
  108.    }
  109.  
  110.    public void print(PrintStream var1, int var2) {
  111.       super.print(var1, var2);
  112.       var1.print("if ");
  113.       this.cond.print(var1);
  114.       var1.print(" ");
  115.       this.ifTrue.print(var1, var2);
  116.       if (this.ifFalse != null) {
  117.          var1.print(" else ");
  118.          this.ifFalse.print(var1, var2);
  119.       }
  120.  
  121.    }
  122. }
  123.